﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SoftwareConsulting.BI11.NumericalMethods.Integration
{
    /// <summary>
    /// Класс улучшенного метода Симпсона
    /// </summary>
    /// <remarks>Разбивает интеграл на несколько отрезков, значительно улучшая точность</remarks>
    public class SimpsonModifiedIntegration
    {
        private double _sum;

        /// <summary>
        /// Конструктор класса
        /// </summary>
        /// <param name="function">Функция, требующая решения</param>
        /// <param name="a">Нижняя граница интеграла</param>
        /// <param name="b">Верхняя граница интеграла</param>
        /// <param name="stepsNumber">Число шагов метода</param>
        public SimpsonModifiedIntegration(FunctionWithOneArgument function, double a, double b, int stepsNumber)
        {
            _sum = 0;
            double h = (b - a) / stepsNumber;
            for (int i = 0; i < stepsNumber; i = i + 2)
                _sum += (function(a + i * h) + 4 * function(a + (i + 1) * h) + function(a + (i + 2) * h)) * h / 3;
        }

        /// <summary>
        /// Возвращает решение
        /// </summary>        
        public double GetSolution() 
        {
            return _sum;
        }
    }
}
